JDBC와 JPA
#Spring #Spring_JDBC #Spring_JPA #Spring_DB
이 글은 JDBC와 JPA를 알지만 뭔가 헷갈리고 쉽게 개념이 흔들린다 싶은 분들이 보면 좋을수도 있는 글 입니다. 모든것을 자세하게 설명하지 않습니다. 그림실력이 많이 없어요. 이해 부탁드립니다..
1. Interface Bulk
JDBC가 뭔지 알아요. JPA도요. 느낌으로요. 왜 쓰는지도 설명할 수 있고 히스토리도 설명가능하고요. 계속 써왔어요. 기술이잔아요 기술. 기술이긴 하지. 표준화 기술이다. 그런데 기술이라면 추상적으로 녹아있어야 하지만 이것들은 뭔가 뭉쳐있었다. 나에게 JDBC와 JPA는 현실적으로 인터페이스 뭉텅이들, 인터페이스 벌크이다.
2. 인터페이스 그리고 구현
JDBC와 JPA가 무엇이냐 물으면 인터페이스 벌크라고 대답할 것 같습니다. 데이터베이스 조작과 ORM을 위한 인터페이스 벌크라고요.
자바가(오라클이) 인터페이스로 템플릿을 만들어놓고 각 벤더나 서비스 개발사에게 템플릿을 구현하면 되게끔 했습니다. 그래서 우리는 실질적으로 구현체를 이용해 이 기능들을 사용하지만 우리가 대체로 만나게 되는 것들은 인터페이스 타입의 객체들입니다. 둘이 이렇게 매칭된다고 그려보는것이 저에게는 도움이 되었습니다. (위쪽 그림은 인터페이스 아래쪽 그림은 구현체 입니다.)
3. 각 인터페이스를 설명하는 그림들
블로그들을 보면 데이터베이스 연결을 설명할 때도, 커넥션 풀을 설명하는 글도, 영속화나 트랜잭션에 대해서 설명하는 글들도 있다. JDBC와 JPA는 데이터 기술의 전반에 뻗어있고 서로 관계가 긴밀하기 때문에 하나의 키워드를 검색해도 모두 조금씩 다른 부분을 살펴본다. 눈감고 코끼리를 만졌을 때 누군가는 기둥같다고 하고 누군가는 긴 덩굴이라고 하는것 처럼. 내가 본 전체는 아래와 같다.
3-1. JDBC
JDBC는 Java DataBase Connectivity의 약자로 세상에 많은 데이터베이스들이 자바 애플리케이션과 '연결해서, 사용하는 방식'을 표준화하고자 만든 인터페이스 벌크이다. 연결만 하는것이 아니라 사용하는 방식을 표준화 시킨것이라는 것에 주목하자. 연결을 맺고(네트워크 세션을 맺고), 쿼리를 날리고, 반환값을 적절하게 처리하는 것까지가 JDBC의 범위이다.
요것만을 사용해도 데이터베이스를 이용한 자바애플리케이션을 만들 수 있다. 연결 방법은 JDBC란, Min.log, 민성재님의 포스트를 참고하면 된다.
3-2. JPA
JPA는 Java Persistence API로 ORM(Object-Relational Mapping)을 위해 만든 표준 인터페이스 벌크이다. ORM은 데이터를 객체로 쓰기 위한 기술이다. 생각해보면 데이터베이스에 저장된 것들은 텍스트라고 생각하면 우리가 애플리케이션에서 쓰는 데이터들은 객체이다. (객체는 생명주기가 있고, 다른 객체와 관계를 맺는 등의 특징이 있다.) 텍스트를 가지고와서 객체처럼 써야한다. 이 간극을 매워주는 것이 JPA 기술이다.
그리고 이 때문에 JDBC에서 말하는 트랜잭션과는 결국 같은 동작을 하지만 다른 맥락을 포함하는 트랜잭션도 있게된다. JDBC에서는 실제 물리 데이터베이스의 트랜잭션을 의미해서 autocommit을 false로 두고 쿼리를 진행한 후 이상이 없으면 커밋을 해서 트랜잭션을 마무리하고 이상이 있으면 false 이후부터 전체 쿼리의 결과를 롤백한다. JPA의 트랜잭션은 물리적 트랜잭션까지 도달하긴 하지만 그 전에 객체에 대한 트랜잭션 관리를 한번 더 해준다. 그것이 객체 라이프사이클과 연관성이 있고, 더 나아가서는 서비스 로직별 트랜잭션 전파와도 연관이 된다. 이것은 실제 데이터베이스까지 가지 않고 가상의 캐시와 같은 곳에서 이루어지는 트랜잭션이다.
위와 같은 이유로 JPA에는 EntityManager와 EntityTransaction이라는 인터페이스가 존재하게 된다. 이것들의 관계에 대한 설명은 JPA, Hibernate, 그리고 Spring Data JPA의 차이점, suhwan님의 포스팅을 참고하면 이해할 수 있다.
4. JPA의 엔티티매니저와 트랜잭션, 엔티티매니저와 JDBC의 커넥션
지금까지도 내가 정리한 지식을 100% 확신을 할 수 없는 내용이다. 다른 포스트에서 이것에 대해 설명해보도록 하겠다.
JPA-EntityManager, PersistenceContext
Transaction - JPA, JDBC, DB